# -*- coding: utf-8 -*-
# @Time        :2025/3/11 15:16
# @Author      :文刀水寿
# @File        : 28_爬虫_selenium_元素定位.py
"""
 @Description : selenium的元素定位？

元素定位:自动化要做的就是模拟鼠标和键盘来操作来操作这些元素，点击、输入等等。
操作这些元素前首先要找到它们，webDriver提供很多定位元素的方法。
    方法:
        1.find _element_by_id
        eg:button = browser.find element_by_id('su')
        2.find_elements_by_name
        eg:name = browser.find _element_by_name('wd')
        3.find _elements_by_xpath
        eg:xpath1 = browser.find_elements_by_xpath('//input [@id="su"]')
         4.find_elements_by_tag_name
        eg:names= browser.find_elements_by_tag name('input')
        5.find_elements_by_css_selector
        eg:my_input = browser.find_elements_by_css_selector('#kw')[]
        6.find_elements_by_link_text
        eg:browser.find_element_by_link_text(“新闻")
"""
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.edge.service import Service

driver_path = "D:\PythonCharm\PyCharmProject\pythonProject\爬虫\msedgedriver.exe"
service = Service(executable_path=driver_path)

url = 'https://www.baidu.com'
browser = webdriver.Edge(service=service)
browser.get(url)

# 元素定位
# button = browser.find_element_by_id("//input[@id='su']")
# 报错!!
# 从你的错误信息来看，你已经修正了拼写错误（从 finde_element_by_id 改为 find_element_by_id），
# 但仍然遇到问题。这是因为 find_element_by_id 方法已经被废弃，而你仍然在尝试使用它。
# 从 Selenium 4 开始，find_element_by_*
# 系列方法（如 find_element_by_id、find_element_by_xpath 等）已经被废弃，
# 取而代之的是统一的 find_element() 方法，结合 By 类来定位元素


# 元素定位

# 根据id来找到对象
button = browser.find_element("id", "su")

# 根据标签属性的属性值来获取对象的
button = browser.find_element("name", "wd")

# 根据xpath语句来获取对象
button = browser.find_element("xpath", "//input[@id='su']")

# 根据标签的名字来获取对象

# By.TAG_NAME 的作用：
# 它会查找页面中第一个匹配指定标签名的元素。
# 如果页面中有多个相同标签名的元素，它只会返回第一个。
button = browser.find_element(By.TAG_NAME, 'input')
"""
从你的错误信息来看，问题出在 find_element 方法的使用方式上。具体来说，你在调用 find_element 时，传入了 'tag_name' 作为第一个参数，这是不正确的。
错误原因
在 Selenium 4 及更高版本中，find_element 方法的正确用法是结合 By 类来定位元素。你直接传入了字符串 'tag_name'，而不是使用 By.TAG_NAME，这导致了 InvalidArgumentException。
修正方法
你需要使用 By 类来指定定位方式。以下是正确的代码示例：

from selenium import webdriver
from selenium.webdriver.common.by import By

# 初始化 WebDriver
browser = webdriver.Edge()  # 你使用的是 Edge 浏览器
browser.get("https://www.baidu.com")  # 打开百度页面

# 使用 By.TAG_NAME 定位元素
button = browser.find_element(By.TAG_NAME, "input")

# 如果需要定位特定的 input 元素，可以使用更具体的定位方式，例如：
# button = browser.find_element(By.ID, "su")  # 通过 ID 定位
# button = browser.find_element(By.XPATH, "//input[@id='su']")  # 通过 XPath 定位

# 打印按钮文本或执行其他操作
print(button.get_attribute("placeholder"))  # 示例：获取输入框的 placeholder 属性
关键点
By 类的使用：
By.ID：通过元素的 id 属性定位。
By.XPATH：通过 XPath 表达式定位。
By.TAG_NAME：通过 HTML 标签名定位。
By.CLASS_NAME：通过类名定位。
By.CSS_SELECTOR：通过 CSS 选择器定位。
By.LINK_TEXT：通过链接文本定位。
By.PARTIAL_LINK_TEXT：通过部分链接文本定位。
By.NAME：通过 name 属性定位。
避免直接传入字符串：
在 Selenium 4 中，find_element 方法不再接受直接传入的字符串作为定位方式。必须通过 By 类指定定位策略。
检查浏览器驱动：
你使用的是 Edge 浏览器，请确保你的 Edge 浏览器和对应的 WebDriver 版本匹配。如果不匹配，可能会导致其他问题。
总结
你的代码中直接传入了 'tag_name'，而不是使用 By.TAG_NAME，这导致了 InvalidArgumentException。按照上述修正方法，使用 By 类来指定定位方式，可以解决这个问题。
"""

# 根据bs4的语法来获取对象
button = browser.find_element(By.CSS_SELECTOR, '#su')

# 获取链接文本
# 关于 By.LINK_TEXT
# 作用：通过超链接的完整文本内容来定位 <a> 标签元素。
# 特点：
# 需要完全匹配链接的文本内容，不支持模糊匹配。
# 如果页面中有多个链接具有相同的文本内容，它会返回第一个匹配的元素。
# 如果链接文本包含空格或换行符，这些也会被精确匹配。
button = browser.find_element(By.LINK_TEXT, '地图')

print(button)
